CodeDeployを使用したECS-FargateのBlue/Green Deploymentをしてみた。
はじめに
Blue/Green Deploymentとは?
Blue/Green Deploymentでは、2つの環境を作成します。1つの環境(Blue)は現在のアプリケーションバージョンを実行し、もう1つの(Green)は新しいアプリケーションバージョンを実行します。Green環境でのテストが完了すると、アプリケーショントラフィックはGreen環境に転送されて、Blue環境は非推奨になります。
この記事では、CodeDeployを使用したFargateのblue/green deploymentをしてみました。
やってみた
Application Load Balancer の作成
Target Groupsの作成
- EC2 コンソールで、Load Balancingで Target Groupsを選択しておきます。
- Create target group を選択して、以下の設定で2つのTarget Groupsを作成しておきます。
- Target type : IP
- Target Group1 name : BlueGreenTarget1
- Target Group2 name : BlueGreenTarget2
- Protocol : HTTP
- Port : 80
Application Load Balancer の作成
- EC2 コンソールでLoad Balancersを選択して、Create Load Balancer を選択しておきます。
- ロードバランサーの名前を入力し、VPC、サブネット、セキュリティグループを選択しておきます。
- この設定でListenerを追加しておきます。
- Protocol : HTTP
- Port : 80
- Forward to : 前の手順で作成されたTarget Group1(BlueGreenTarget1)
ECS-Fargateの作成
IAMロールの作成
- この設定でIAMロールを作成しておきます。
- 信頼されたエンティティの種類 : AWS のサービス
- ユースケース : Elastic Container Service - Elastic Container Service Task
- ポリシー : AmazonECSTaskExecutionRolePolicy
- ロールの名前 : ecsTaskExecutionRole
ECS クラスターの作成
- このコマンドを使用して、名前でクラスターを作成しておきます。
aws ecs create-cluster --cluster-name BlueGreenCluster --region us-east-1
タスク定義の登録
Fargateタスク定義ファイル [ JSON File ] を作成しておきます「task.json」。ファイルで前の手順で作成されたロールのArnを使用します。
{ "family": "BlueGreenTask", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512", "executionRoleArn": "arn:aws:iam::account-id:role/ecsTaskExecutionRole", "containerDefinitions": [ { "name": "fargate-app", "image": "httpd:2.4", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>ECS FARGATE</title> </head><body> <h2>Application hosted using ECS-Fargate</h2></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ] }
- このコマンドを使用してタスク定義を登録しておきます。
aws ecs register-task-definition --cli-input-json file://task.json --region us-east-1
ECSサービスの作成
[Service.json]ファイルを作成しておきます。このファイルには、Deployment、ロードバランサー、およびネットワーク設定があります。
{ "launchType": "FARGATE", "taskDefinition": "BlueGreenTask", "platformVersion": "LATEST", "cluster": "BlueGreenCluster", "serviceName": "BlueGreenService", "schedulingStrategy": "REPLICA", "deploymentController": { "type": "CODE_DEPLOY" }, "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-id" ], "subnets": [ "subnet-id1", "subnet-id2" ] } }, "loadBalancers": [ { "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:account-id:targetgroup/BlueGreenTagret1/e123456789", "containerName": "fargate-app", "containerPort": 80 } ], "desiredCount": 1 }
- このコマンドを使用して、ECSサービスを作成しておきます。
aws ecs create-service --cli-input-json file://service.json --region us-east-1
CodeDeployの作成
CodeDeploy IAMロールの作成
- この設定でIAMロールを作成しておきます。
- 信頼されたエンティティの種類 : AWS のサービス
- ユースケース : CodeDeploy , CodeDeploy - ECS
- ポリシー : AWSCodeDeployRoleForECS
- ロールの名前 : ecsCodeDeployRole
アプリケーションの作成
- CodeDeploy コンソールで、Create application を選択しておきます。
- アプリケーション名を入力して、Compute PlatformでAmazon ECSを選択して、アプリケーションを作成しておきます。
デプロイ-グループの作成
- CodeDeploy コンソールのアプリケーションページで、Create deployment groupを選択します。
- デプロイグループ名を入力して、前の手順で作成したサービスロールをアタッチしておきます。
- 環境設定で前の手順で作成したECS クラスター名とECS サービス名を選択しておきます。
- Load balancerで前の手順で作成したLoad balancer、本稼働リスナーポート、ターゲットグループ 1 の名前、とターゲットグループ 2 の名前を選択しておきます。
- デプロイ設定:
- Traffic rerouting : すぐにトラフィックを再ルーティング
- Deployment configuration : ECSLinear10PercentEvery1Minutes
- Original revision termination : 10Minutes
- 詳細 – オプションで、「デプロイが失敗したときにロールバックする」を有効にして、デプロイ-グループを作成します。
AppSpecファイルの作成
CodeDeploy デプロイグループの内容で appspec.yamlファイルを作成します。このファイルをs3バケットにアップロードしておきます。
version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "arn:aws:ecs:us-east-1:account-id:task-definition/BlueGreenTask:1" LoadBalancerInfo: ContainerName: "fargate-app" ContainerPort: 80 PlatformVersion: "LATEST"
Deploymentの作成
- CodeDeploy コンソールのアプリケーションページで、Create deployment を選択します。
- デプロイグループを選択して、S3 URIを入力して、Deploymentを作成しておきます。
トラフィック移行の進行状況確認する
下の画像から、トラフィックの10%が毎分移行されています。
すべてのトラフィックが移行された後、元のタスクは終了されました。
最初にtarget1をリスナーとして追加しましたが、トラフィックが移行された後、target2が新しいリスナーとして追加されました。
まとめ
CodeDeployを使用したECS-FargateのBlue/Green Deploymentをしてみた。Blue/Green Deploymentを使用すると、アプリケーションの可用性が向上し、デプロイメントのリスクが軽減されます。Elastic Beanstalk、OpsWorks、CloudFormation、CodeDeploy、Amazon ECSなど、多くのAWSデプロイメントサービスがBlue/Green Deploymentをサポートされますs。